<?php
/**
 * 建造模式
 *
 * 将一个复杂对象按照一道道工序完成(当算法上相对稳定的时候)；
 *
 *
 * 优点：减少代码修改量。缺点:难以应对算法上的需求变动。
 */

//指导者
class Director
{
	public function __construct(AbstractBuilder $builder){
		//指导完成的工序
		$builder->BuildPartA();
		$builder->BuildPartB();
	}
}
//建造者抽象类
abstract class AbstractBuilder
{
	//实现的产品
	private $product;
	//需要实现的工序
	abstract public function buildPartA();
	abstract public function buildPartB();
	//返回产品
	abstract public function getProduct();
}
//具体建造者
class concreteBuilder extends AbstractBuilder{
    /**
     * @var
     */
    protected $product;
	public function buildPartA(){
		$this->product = new Product();
		$this->product->add('partA');
	}
	public function buildPartB(){
		$this->product->add('paryB');
	}
	public function getProduct(){
		return $this->product;
	}
}
//产品
class Product
{
	public $parts = array();
	//产品封装的方法
	public function add($part){
		array_push($this->parts,$part);
	}
	//展示成型的产品
	public function show(){
		var_dump($this->parts);
	}
}
//初始化具体建造者
$builder = new concreteBuilder();
//指导建造(可以更换其指导流程)
$director = new Director($builder);
//返回产品
$product = $builder->getProduct();
//产品展示
$product->show();